﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Helper
{
    /// <summary>
    /// 提供常用的日期时间操作工具方法，如获取指定日期的开始时间、格式化时间、获取 Unix 时间戳等。
    /// </summary>
    public class DateTimeHelper
    {
        /// <summary>
        /// 获取指定日期的开始时间。如果日期为空或为最小值，则返回当前时间。
        /// 可以通过传入的 days 参数来调整返回日期。
        /// </summary>
        /// <param name="dateTime">可选的日期时间</param>
        /// <param name="days">调整的天数，默认为 0</param>
        /// <returns>指定日期的开始时间</returns>
        public static DateTime GetBeginTime(DateTime? dateTime, int days = 0)
        {
            // 如果日期为空或者为最小值，返回当前时间加上指定的天数
            if (dateTime == DateTime.MinValue || !dateTime.HasValue)
            {
                return DateTime.Now.AddDays(days);
            }
            // 如果有值，返回传入的日期时间
            return dateTime ?? DateTime.Now;
        }

        /// <summary>
        /// 将毫秒数格式化为天、小时、分钟、秒的字符串表示形式。
        /// </summary>
        /// <param name="ms">毫秒数</param>
        /// <returns>格式化后的时间字符串</returns>
        public static string FormatTime(long ms)
        {
            int num = 1000;  // 毫秒数
            int num2 = num * 60;  // 一分钟的毫秒数
            int num3 = num2 * 60;  // 一小时的毫秒数
            int num4 = num3 * 24;  // 一天的毫秒数
            long num5 = ms / num4;  // 天数
            long num6 = (ms - num5 * num4) / num3;  // 小时数
            long num7 = (ms - num5 * num4 - num6 * num3) / num2;  // 分钟数
            long num8 = (ms - num5 * num4 - num6 * num3 - num7 * num2) / num;  // 秒数
            long num9 = ms - num5 * num4 - num6 * num3 - num7 * num2 - num8 * num;  // 剩余的毫秒数

            // 格式化每一部分，确保每部分为两位数
            string text = ((num5 < 10) ? ("0" + num5) : (num5.ToString() ?? ""));
            string text2 = ((num6 < 10) ? ("0" + num6) : (num6.ToString() ?? ""));
            string text3 = ((num7 < 10) ? ("0" + num7) : (num7.ToString() ?? ""));
            string text4 = ((num8 < 10) ? ("0" + num8) : (num8.ToString() ?? ""));
            string text5 = ((num9 < 10) ? ("0" + num9) : (num9.ToString() ?? ""));
            text5 = ((num9 < 100) ? ("0" + text5) : (text5 ?? ""));

            // 返回格式化后的字符串
            return $"{text} 天 {text2} 小时 {text3} 分 {text4} 秒";
        }

        /// <summary>
        /// 将指定的 DateTime 对象转换为 Unix 时间戳（毫秒表示）。
        /// </summary>
        /// <param name="dt">要转换的日期时间</param>
        /// <returns>Unix 时间戳（毫秒表示）</returns>
        public static long GetUnixTimeStamp(DateTime dt)
        {
            return ((DateTimeOffset)dt).ToUnixTimeMilliseconds();
        }

        /// <summary>
        /// 获取指定日期的最小时间（当天的 00:00:00）。
        /// </summary>
        /// <param name="dt">要获取最小时间的日期</param>
        /// <returns>当天的最小时间</returns>
        public static DateTime GetDayMinDate(DateTime dt)
        {
            return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
        }

        /// <summary>
        /// 获取指定日期的最大时间（当天的 23:59:59）。
        /// </summary>
        /// <param name="dt">要获取最大时间的日期</param>
        /// <returns>当天的最大时间</returns>
        public static DateTime GetDayMaxDate(DateTime dt)
        {
            return new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59);
        }

        /// <summary>
        /// 格式化可空的 DateTime 对象。如果日期时间是当前年份，则返回月日小时分钟格式；否则，返回年-月-日小时分钟格式。
        /// </summary>
        /// <param name="dt">可空的日期时间</param>
        /// <returns>格式化后的日期时间字符串</returns>
        public static string FormatDateTime(DateTime? dt)
        {
            if (dt.HasValue)
            {
                if (dt.Value.Year == DateTime.Now.Year)
                {
                    return dt.Value.ToString("MM-dd HH:mm");
                }
                return dt.Value.ToString("yyyy-MM-dd HH:mm");
            }
            return string.Empty;
        }
    }

}
